package app

import (
	"github.com/giter/go.rice"
	"os"
	"io/ioutil"
	//"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/contrib/sessions"
	"github.com/gin-gonic/contrib/gzip"
	"hub.hddznet.com/uniplatform/framework/context"
	"hub.hddznet.com/app/framework/app/engines"
)

// 初始化配置
func Init(cbox *rice.Box) {
	cfg = context.InitConfig(cbox)
	for _, fn := range afterInitConfig {
		fn()
	}
}

/*
这个方法会在初始化需要放在init文件中执行，并且，逻辑上需要在配置文件加载完成之前，执行
因为所有传入这个方法的所有func会被保存起来，当配置文件加载完成之后，会立即执行所有调用
过这个方法而被保存起来的func，而配置文件初始化完成之后调用这个方法的所有函数则无效
*/
var afterInitConfig []func()

func AfterInitConfig(fn func()) {
	afterInitConfig = append(afterInitConfig, fn)
}

// 运行web程序
func run() error {
	// 启动数据库引擎
	//base.NewDataService()

	//1. gin引擎的启动

	engines.Gin.Use(gzip.Gzip(gzip.BestSpeed))

	store := sessions.NewCookieStore([]byte("midway_app"))
	store.Options(sessions.Options{
		Path:     "/",
		MaxAge:   0,
		HttpOnly: true,
	})
	engines.Gin.Use(sessions.Sessions("sid", store))

	//5. 启动服务
	port := MustValue("system", "port", "40000")

	//6. https
	useTLS := MustBool("system", "tls", true)
	if useTLS {
		ssl, err := rice.FindBox("conf")
		if err != nil {
			panic(err)
		}
		if _, err := os.Stat("./conf/ssl/server.crt"); os.IsNotExist(err) {
			bs, err := ssl.Bytes("ssl/server.crt")
			if err != nil {
				panic(err)
			}
			os.MkdirAll("./conf/ssl", 0666)
			ioutil.WriteFile("./conf/ssl/server.crt", bs, 0666)
		}

		if _, err := os.Stat("./conf/ssl/server.key"); os.IsNotExist(err) {
			bs, err := ssl.Bytes("ssl/server.key")
			if err != nil {
				panic(err)
			}
			os.MkdirAll("./conf/ssl", 0666)
			ioutil.WriteFile("./conf/ssl/server.key", bs, 0666)
		}
		engines.Gin.RunTLS(":"+port, "./conf/ssl/server.crt", "./conf/ssl/server.key")
	} else {
		engines.Gin.Run(":" + port)
	}
	return nil
}
